home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_87 / devspkr.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  7KB  |  215 lines

  1. {****************************************************************************}
  2. {                                                                            }
  3. { MODULE:         DevSpkr                                                    }
  4. {                                                                            }
  5. { DESCRIPTION:    Device driver for the PC internal speaker.                 }
  6. {                 It uses timer polling.                                     }
  7. {                                                                            }
  8. { AUTHOR:         Juan Carlos Arévalo                                        }
  9. {                                                                            }
  10. { MODIFICATIONS:  Nobody (yet ;-)                                            }
  11. {                                                                            }
  12. { HISTORY:        11-Nov-1992 Description                                    }
  13. {                                                                            }
  14. { (C) 1992 VangeliSTeam                                                      }
  15. {____________________________________________________________________________}
  16.  
  17. UNIT DevSpkr;
  18.  
  19. INTERFACE
  20.  
  21.  
  22.  
  23.  
  24. { Device ID String. }
  25.  
  26. CONST                    
  27.   SpkrDevID = 'Speaker';
  28.  
  29.  
  30.  
  31.  
  32. IMPLEMENTATION
  33.  
  34. USES SoundDevices, StrConst;
  35.  
  36.  
  37.  
  38.  
  39. {----------------------------------------------------------------------------}
  40. { Device data.                                                               }
  41. {____________________________________________________________________________}
  42.  
  43. CONST                                     { Default conversion table for 16 KHz. }
  44.   SpkrBaseTabla : ARRAY[0..255] OF BYTE =
  45.         ($40,$40,$40,$40,$40,$40,$40,$40,$40,$40,$3F,$3F,$3F,$3F,$3F,$3F,
  46.          $3F,$3F,$3F,$3F,$3F,$3F,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,
  47.          $3D,$3D,$3D,$3D,$3D,$3D,$3D,$3D,$3D,$3C,$3C,$3C,$3C,$3C,$3C,$3C,
  48.          $3C,$3C,$3C,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3A,$3A,$3A,
  49.          $3A,$3A,$3A,$3A,$3A,$3A,$3A,$39,$39,$39,$39,$39,$39,$39,$39,$39,
  50.          $39,$38,$38,$38,$38,$38,$38,$38,$38,$37,$37,$37,$37,$37,$36,$36,
  51.          $36,$36,$35,$35,$35,$35,$34,$34,$34,$33,$33,$32,$32,$31,$31,$30,
  52.          $30,$2F,$2E,$2D,$2C,$2B,$2A,$29,$28,$27,$26,$25,$24,$23,$22,$21,
  53.          $20,$1F,$1E,$1D,$1C,$1B,$1A,$19,$18,$17,$16,$15,$14,$13,$12,$11,
  54.          $11,$10,$10,$0F,$0F,$0E,$0E,$0D,$0D,$0D,$0C,$0C,$0C,$0C,$0B,$0B,
  55.          $0B,$0B,$0A,$0A,$0A,$0A,$0A,$09,$09,$09,$09,$09,$09,$09,$09,$09,
  56.          $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$07,$07,$07,$07,
  57.          $07,$07,$07,$06,$06,$06,$06,$06,$06,$06,$06,$06,$06,$06,$05,$05,
  58.          $05,$05,$05,$05,$05,$05,$05,$05,$04,$04,$04,$04,$04,$04,$04,$04,
  59.          $04,$04,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$02,$02,$02,$02,
  60.          $02,$02,$02,$02,$02,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01);
  61.  
  62. VAR
  63.   SpkrTabla : ARRAY[0..255] OF BYTE;   { Conversion table that will be used. }
  64.  
  65.  
  66.  
  67.  
  68. {$L DEVSpkr}   { Assembler IRQ. }
  69.  
  70. PROCEDURE SpkrIntHandler; FAR; EXTERNAL;
  71.  
  72.  
  73.  
  74.  
  75. {----------------------------------------------------------------------------}
  76. { Name function.                                                             }
  77. {____________________________________________________________________________}
  78.  
  79. FUNCTION SpkrName : TDevName; FAR;
  80.   BEGIN
  81.     SpkrName := GetString(StrDevSpkrName);
  82.   END;
  83.  
  84.  
  85.  
  86.  
  87. {----------------------------------------------------------------------------}
  88. { Autodetect routine. It's always present.                                   }
  89. {____________________________________________________________________________}
  90.  
  91. FUNCTION DevDetect : BOOLEAN; FAR;
  92.   BEGIN
  93.     DevDetect := TRUE;
  94.   END;
  95.  
  96.  
  97.  
  98.  
  99. {----------------------------------------------------------------------------}
  100. { Routine for adjusting the conversion table to the new output freq.         }
  101. {____________________________________________________________________________}
  102.  
  103. PROCEDURE AdjustTable;
  104.   VAR
  105.     i    : WORD;
  106.     TVal : WORD;
  107.   BEGIN
  108.     TVal := TimerVal SHR 1;
  109.     FOR i := 0 TO 255 DO
  110.       SpkrTabla[i] := (WORD((SpkrBaseTabla[i]-1) * TVal) DIV $39) + 1;
  111.   END;
  112.  
  113.  
  114.  
  115.  
  116. {----------------------------------------------------------------------------}
  117. { Device Initialisation routine.                                             }
  118. {____________________________________________________________________________}
  119.  
  120. PROCEDURE DevInit(Hz: WORD); FAR; 
  121.   BEGIN
  122.     ASM
  123.         IN      AL,61h
  124.         OR      AL,3      
  125.         OUT     61h,AL    { Turn on speaker. }
  126.  
  127.         MOV     AL,0B6h
  128.         OUT     43h,AL    
  129.  
  130.         MOV     AL,0B0h
  131.         OUT     43h,AL
  132.         MOV     AL,034h
  133.         OUT     43h,AL
  134.  
  135.         XOR     AL,AL
  136.         OUT     42h,AL
  137.         OUT     42h,AL
  138.         MOV     AL,10010000b
  139.         OUT     43h,AL    { Select Speaker timer mode. }
  140.     END;
  141.  
  142.     CalcTimerData(Hz);    { Then do the standard polling initialisation. }
  143.     InitTimer;
  144.     AdjustTable;          { And adjust the table for initial freq.       }
  145.   END;
  146.  
  147.  
  148.  
  149.  
  150. {----------------------------------------------------------------------------}
  151. { Device deinitialisation routine.                                           }
  152. {____________________________________________________________________________}
  153.  
  154. PROCEDURE DevEnd; FAR; ASSEMBLER;
  155.   ASM
  156.         IN      AL,61h
  157.         AND     AL,11111100b 
  158.         OUT     61h,AL       { Turn off speaker. }
  159.   END;
  160.  
  161.  
  162.  
  163.  
  164. {----------------------------------------------------------------------------}
  165. { Accesory routines.                                                         }
  166. {____________________________________________________________________________}
  167.  
  168. PROCEDURE DevChgHz(Hz: WORD); FAR;
  169.   BEGIN
  170.     CalcTimerData(Hz);
  171.     InitTimer;
  172.     AdjustTable;
  173.   END;
  174.  
  175. PROCEDURE DevPoll; FAR;
  176.   BEGIN
  177.   END;
  178.  
  179.  
  180.  
  181.  
  182. {----------------------------------------------------------------------------}
  183. { Device record.                                                             }
  184. {____________________________________________________________________________}
  185.  
  186. CONST
  187.   SpkrData : TSoundDevice = (
  188.     DevID      : SpkrDevID;
  189.     DMA        : FALSE
  190.   );
  191.  
  192.  
  193.  
  194.  
  195. {----------------------------------------------------------------------------}
  196. { Init code.                                                                 }
  197. {____________________________________________________________________________}
  198.  
  199. BEGIN
  200.  
  201.   WITH SpkrData DO BEGIN
  202.     Name            := SpkrName;
  203.     AutoDetect      := DevDetect;
  204.     InitRut         := DevInit;
  205.     ChgHzProc       := DevChgHz;
  206.     GetRealFreqProc := GetRealFreq;
  207.     TimerHandler    := SpkrIntHandler;
  208.     PollRut         := DevPoll;
  209.     EndRut          := DevEnd;
  210.   END;
  211.  
  212.   InitDevice(@SpkrData);
  213.  
  214. END.
  215.